package com.xlkj.ms.tools.core.commons.exceptions;

import org.springframework.beans.BeanUtils;

/**
 * 调用方可以继承该异常类,来自定义实现业务异常的包装响应
 * <ul>
 *     <li>如果是业务错误（如：查询失败）实现对业务错误的抛出，这个抛出的“异常”会被切面捕获，并按照一定的格式进行响应，这样业务代码中就不需要过多的关心错误响应的组包、响应，都由切面来完成</strong></li>
 *     <li>如果是非业务异常（非检查异常或者检查异常）也会被切面捕获，并且按照一定的格式进行响应</li>
 * </ul>
 *
 * @author zhuqifeng
 * @date 2021/11/10 11:54
 * @package com.xlkj.ms.tools.core.commons.exceptions
 */
public class CustomizeBizException extends RuntimeException {

    private static final long serialVersionUID = -2250766929171464817L;

    /**
     * 当抛出业务错误时，将通过该方法进行返回参数的组装
     *
     * <pre>
     *     所有成员变量组成的集合一定要是响应类成员变量的一个子集
     *     如：响应类中的成员变量有：code,msg,redirect,data，那么业务异常类中的成员变量必须要包含code,msg,redirect、data组成
     *     至于异常类中需要出现哪些属性，看业务需要，比如正常来说，异常类中，只需要出现code跟msg就可以，或者code跟redirect组合等等
     * </pre>
     *
     * @param clazz 需要返回的响应类型(且这个类必须是ResponseWrapper的子类，同时有个无参构造函数)
     * @param <T>
     * @return
     * @throws Exception
     */
    public <T> Object wrapperBizFailed(Class<T> clazz) throws Exception{
        Object object = clazz.newInstance();
        BeanUtils.copyProperties(this, object);
        return object;
    }
}